﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using NLog;
using OSA.Policlinic.UI.WFApplicationWCF.RegistryServiceReference;

namespace OSA.Policlinic.UI.WFApplication
{
    public partial class PatientForm : Form
    {
        private bool _isAdd;
        private Patient editingPatient;
        private List<InsuranceOrganization> insuranceOrganizations;
        private readonly IRegistryBusinessApplication registryBusinessApplication;
        private mainForm owner;
        private static Logger logger = LogManager.GetCurrentClassLogger();

        public PatientForm(mainForm form)
        {
            InitializeComponent();
            insuranceOrganizations=new List<InsuranceOrganization>();
            registryBusinessApplication = RegistryBusinessApplicationHome.GetInstanse();
            UpdateInsuranseOrganizationList();
            _isAdd = true;
            owner = form;
            button4.Enabled = false;
            OKButton.Text = "Сохранить";
            AddKKFButton.Enabled = false;
            button2.Enabled = false;
            logger.Trace("Форма PatientForm успешно инициализирована конструктором по умолчанию для добавления нового пациента");
        }
        public PatientForm(mainForm form, Patient patient)
        {
            InitializeComponent();
            insuranceOrganizations = new List<InsuranceOrganization>();
            registryBusinessApplication = RegistryBusinessApplicationHome.GetInstanse();
            UpdateInsuranseOrganizationList();
            editingPatient = patient;
            owner = form;

            PostIndexTextBox.Text = editingPatient.Address.PostIndex;
            CityTextBox.Text = editingPatient.Address.City;
            StreetTextBox.Text = editingPatient.Address.Street;
            HouseTextBox.Text = editingPatient.Address.House;
            FlatTextBox.Text = editingPatient.Address.Flat;

            for(int i = 0; i < insuranceOrganizations.Count; i++)
            {
                if (insuranceOrganizations[i].Name == editingPatient.InsurancePolis.InsuranceOrganization.Name)
                    IOrganizationComboBox.SelectedIndex = i;
            }

            SeriesTextBox.Text = editingPatient.InsurancePolis.Series;
            NumberTextBox.Text = editingPatient.InsurancePolis.PolisNumber;
            RegistrationDateTimePicker.Value = editingPatient.InsurancePolis.Registration;
            ExpirationDateTimePicker.Value = editingPatient.InsurancePolis.Expiration;

            SurnameTextBox.Text = editingPatient.Surname;
            NameTextBox.Text = editingPatient.Name;
            MiddlenameTextBox.Text = editingPatient.Middlename;
            SexComboBox.SelectedIndex = editingPatient.Sex == "м" ? 0 : 1;
            BirthDateTimePicker.Value = editingPatient.Birth;

            UpdateKKFList(patient.Id);

            UpdateVaccinaList(patient.Id);
            logger.Trace("Форма PatientForm успешно инициализирована для просмотра данных о существующем пациенте");

        }
        private void UpdateInsuranseOrganizationList()
        {
            insuranceOrganizations.AddRange(registryBusinessApplication.GetAllInsuranceOrganizations());
            IOrganizationComboBox.Items.Clear();
            foreach (var insuranceOrganization in insuranceOrganizations)
            {
                IOrganizationComboBox.Items.Add(insuranceOrganization.Name);
            }
            logger.Trace("Список страховых компаний в форме пациента успешно обновлен");
        }

        private void OKButton_Click(object sender, EventArgs e)
        {
            if(IsTextBoxEmpty)
            {
                string error = "Не заполнены следующие поля:\n";
                if (SurnameTextBox.Text.Trim().Length == 0){ error += "Фамилия\n"; }
                if (NameTextBox.Text.Trim().Length == 0) { error += "Имя\n"; }
                if (MiddlenameTextBox.Text.Trim().Length == 0) { error += "Отчество\n"; }
                if (SexComboBox.SelectedIndex == -1) { error += "Пол\n"; }
                if (PostIndexTextBox.Text.Trim().Length == 0) { error += "Почтовый индекс\n"; }
                if (CityTextBox.Text.Trim().Length == 0) { error += "Город\n"; }
                if (StreetTextBox.Text.Trim().Length == 0) { error += "Улица\n"; }
                if (HouseTextBox.Text.Trim().Length == 0) { error += "Дом\n"; }
                if (FlatTextBox.Text.Trim().Length == 0) { error += "Квартира\n"; }
                if (SeriesTextBox.Text.Trim().Length == 0) { error += "Серия полиса\n"; }
                if (NumberTextBox.Text.Trim().Length == 0) { error += "Номер полиса\n"; }
                if (IOrganizationComboBox.SelectedIndex == -1) { error += "Страховая компания"; }
                MessageBox.Show(error, "Внимание!");
                logger.Warn(error + " при попытке сохранения пациента");
                return;
            }
            if (PostIndexTextBox.Text.Length != 6)
            {
                MessageBox.Show("Длинна индекса должна быть ровно 6 символов", "Внимание!", MessageBoxButtons.OK);
                logger.Warn("Неправильно заполнено поле 'Индекс' при попытке сохранения пациента");
                return;
            }
            int _try = -1;
            if (!int.TryParse(PostIndexTextBox.Text, out _try) || _try < 1)
            {
                MessageBox.Show("Неправильно заполнено поле 'Почтовый индекс'", "Внимание!");
                logger.Warn("Неправильно заполнено поле 'Индекс' при попытке сохранения пациента");
                return;
            }
            _try = -1;
            if(!int.TryParse(FlatTextBox.Text, out _try) || _try < 1)
            {
                MessageBox.Show("Неправильно заполнено поле 'Квартира'", "Внимание!");
                logger.Warn("Неправильно заполнено поле 'Квартира' при попытке сохранения пациента");
                return;
            }
            _try = -1;
            if (!int.TryParse(NumberTextBox.Text, out _try) || _try < 1)
            {
                MessageBox.Show("Неправильно заполнено поле 'Номер полиса'", "Внимание!");
                logger.Warn("Неправильно заполнено поле 'Номер полиса' при попытке сохранения пациента");
                return;
            }
            if(_isAdd)
            {
                Address address = new Address(PostIndexTextBox.Text, "Россия", CityTextBox.Text, StreetTextBox.Text, HouseTextBox.Text, FlatTextBox.Text);
                InsuranceOrganization insuranceOrganization = insuranceOrganizations[IOrganizationComboBox.SelectedIndex];
                InsurancePolis insurancePolis = new InsurancePolis(SeriesTextBox.Text, NumberTextBox.Text, RegistrationDateTimePicker.Value, ExpirationDateTimePicker.Value, insuranceOrganization);
                Patient patient = new Patient(SurnameTextBox.Text, NameTextBox.Text, MiddlenameTextBox.Text, SexComboBox.SelectedIndex == 0 ? "м" : "ж", BirthDateTimePicker.Value, address, insurancePolis);
                editingPatient = registryBusinessApplication.SavePatient(patient);
                _isAdd = false;
                AddKKFButton.Enabled = true;
                button2.Enabled = true;
                logger.Debug("Новый пациент добавлен");
                MessageBox.Show("Пациент добавлен");
            }
            else
            {
                editingPatient.Address.PostIndex = PostIndexTextBox.Text;
                editingPatient.Address.City = CityTextBox.Text;
                editingPatient.Address.Street = StreetTextBox.Text;
                editingPatient.Address.House = HouseTextBox.Text;
                editingPatient.Address.Flat = FlatTextBox.Text;

                InsuranceOrganization insuranceOrganization = insuranceOrganizations[IOrganizationComboBox.SelectedIndex];

                editingPatient.InsurancePolis.Series = SeriesTextBox.Text;
                editingPatient.InsurancePolis.PolisNumber = NumberTextBox.Text;
                editingPatient.InsurancePolis.Registration = RegistrationDateTimePicker.Value;
                editingPatient.InsurancePolis.Expiration = ExpirationDateTimePicker.Value;
                editingPatient.InsurancePolis.InsuranceOrganization = insuranceOrganization;

                editingPatient.Surname = SurnameTextBox.Text;
                editingPatient.Name = NameTextBox.Text;
                editingPatient.Middlename = MiddlenameTextBox.Text;
                editingPatient.Sex = SexComboBox.SelectedIndex == 0 ? "м" : "ж";
                editingPatient.Birth = BirthDateTimePicker.Value;

                editingPatient = registryBusinessApplication.UpdatePatient(editingPatient);
                logger.Debug("Данные пациента изменены");
                MessageBox.Show("Данные пациента изменены");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            logger.Debug("Нажата кнопка 'Отмена' формы пациента");
            Close();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            AddPatientDataForm addForm = new AddPatientDataForm();
            if (addForm.Controls.Count > 0)
            {
                addForm.Controls.Clear();
            }
            if (addForm.newIO == null)
            {
                addForm.newIO = new NewInsuranceOrganisation(addForm);
                addForm.newIO.Dock = DockStyle.Fill;
            }
            addForm.Controls.Add(addForm.newIO);
            addForm.Text = "Новая страховая компания";
            logger.Debug("Нажата кнопка 'Добавить страховую компанию' формы пациента");
            addForm.ShowDialog();
            UpdateInsuranseOrganizationList();
        }

        private void AddKKFButton_Click(object sender, EventArgs e)
        {
            AddPatientDataForm addForm = new AddPatientDataForm();
            if (addForm.Controls.Count > 0)
            {
                addForm.Controls.Clear();
            }
            if (addForm.newIO == null)
            {
                addForm.newVaccina = new NewVaccina(addForm, editingPatient);
                addForm.newVaccina.Dock = DockStyle.Fill;
            }
            addForm.Controls.Add(addForm.newVaccina);
            addForm.Text = "Новые данные о прививке";
            logger.Debug("Нажата кнопка 'Добавить прививку' формы пациента");
            addForm.ShowDialog();
            if (editingPatient != null)
            {
                VaccinaDataGridView.Rows.Clear();
                UpdateVaccinaList(editingPatient.Id);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            AddPatientDataForm addForm = new AddPatientDataForm();
            if (addForm.Controls.Count > 0)
            {
                addForm.Controls.Clear();
            }
            if (addForm.newKKF == null)
            {
                addForm.newKKF = new NewKKF(addForm, editingPatient);
                addForm.newKKF.Dock = DockStyle.Fill;
            }
            addForm.Controls.Add(addForm.newKKF);
            addForm.Text = "Новые данные о флюорографии";
            logger.Debug("Нажата кнопка 'Добавить флюорографию' формы пациента");
            addForm.ShowDialog();
            if(editingPatient != null)
            UpdateKKFList(editingPatient.Id);
        }

        private void UpdateKKFList(int patientId)
        {
            List<KKF> kkf=new List<KKF>(registryBusinessApplication.GetKKFByPatientId(patientId));
            if (kkf.Count != 0)
            {
                kkf.Sort((a, b) => b.KkfDate.CompareTo(a.KkfDate));
                kkfDateLabel.Text = string.Format("{0}.{1}.{2}", kkf[0].KkfDate.Day, kkf[0].KkfDate.Month, kkf[0].KkfDate.Year);
                kkfDiagnosisLabel.Text = string.Format("{0}", kkf[0].Diagnosis);
                logger.Debug("Данные о флюорографии в форме пациента успешно обновлены");
            }
        }

        private void UpdateVaccinaList(int patientId)
        {
            List<Vaccina> v = new List<Vaccina>(registryBusinessApplication.GetVaccinaByPatientId(patientId));
            foreach (var vaccina in v)
            {
                object[] row = new object[2];
                row[0] = String.Format("{0}.{1}.{2}", vaccina.VacDate.Day, vaccina.VacDate.Month, vaccina.VacDate.Year);
                row[1] = String.Format("{0}", vaccina.Name);
                VaccinaDataGridView.Rows.Add(row);
                logger.Debug("Список прививок в форме пациента успешно обновлен");
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (owner.mainPanel.Controls.Count > 0)
            {
                owner.mainPanel.Controls.Clear();
            }
            if (owner.ticketControl == null)
            {
                owner.ticketControl = new TicketControl(editingPatient);
                owner.ticketControl.Dock = DockStyle.Fill;
            }
            else
            {
                owner.ticketControl.patient = editingPatient;
                owner.ticketControl.FillPatient();
                owner.ticketControl.ClearDoctor();
                owner.ticketControl.ClearService();
            }
            owner.mainPanel.Controls.Add(owner.ticketControl);
            owner.label1.Text = "Выдать новый талон";
            logger.Debug("Нажата кнопка 'Выдать талон' пациенту с id = {0}", editingPatient.Id);
            Close();
        }

        private bool IsTextBoxEmpty
        {
            get
            {
                if (SurnameTextBox.Text.Trim().Length == 0 || NameTextBox.Text.Trim().Length == 0 || MiddlenameTextBox.Text.Trim().Length == 0 || PostIndexTextBox.Text.Trim().Length == 0 || CityTextBox.Text.Trim().Length == 0 || StreetTextBox.Text.Trim().Length == 0 || HouseTextBox.Text.Trim().Length == 0 || FlatTextBox.Text.Trim().Length == 0 || SeriesTextBox.Text.Trim().Length == 0 || NumberTextBox.Text.Trim().Length == 0 || SexComboBox.SelectedIndex == -1 || IOrganizationComboBox.SelectedIndex == -1)
                    return true;
                return false;
            }
        }

    }
}
